avatar

目录
2018.2 MOCTFcrackme2 WriteUp

2018.2 MOCTFcrackme2 WriteUp

1. 随意看看

拿到题以后打开
mark
随便输入以后回车,程序直接退出

查壳
VC++6.0写的,不放图了

OD分析

字符串搜索

mark

先到Your get the flag, but it ….看看
mark

分析跳转

这个地方有个跳转,也就是判断你输的flag对不对的
但是这个跳转如果爆破是没什么用的,因为你并不能得出真正的flag
翻到上面
mark
可以看到有一行

10<1<>;?8:%w!##&#q./,x(,((

这其实是接下来要与你输入的字符做比较
在jnz判断前面的test下断点,从这段开头的push往下执行,执行到输入字符后,这时候返回来看看寄存器窗口,会发现
mark
ECX里是要比较的字符串,EDX里是你刚刚输入的,而且被加密了,因此我们接下来要做的就是分析这个加密的原理

IDA分析

伪代码分析

分析算法当然是IDA的F5大法了
找到刚刚那一段,F5
mark
这就是整个算法了

可以看到,我们输入字符串之后,它把每一位都代入sub_4010CD,转换后得出新的组合
于是我们应该跟进去
mark
再跟
mark
好了,这就是它的加密算法核心了,先看看这个dword是什么
mark
就是数字6

算法分析

所以这回就彻底清楚了
我们把字符串输入进去,它把每一位都和这个dword做了异或,而dword从6开始累加,最后输出的v7与它原来的做比较

所以依靠这个思路写一个c++程序,不要在意头文件。。。

c++
#include "stdafx.h"
#include<iostream>
#include<string.h>
using namespace std;

int main()
{
int i;
char s[] = "10<1<>;?8:%w!##&#q./,x(,((";
char v[100] = {6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31};
for (i = 0; i<26; i++)
printf("%c", v[i] ^ s[i]);
cin.get();
return 0;
}

这里直接带入

10<1<>;?8:%w!##&#q./,x(,((

就可以,因为两次异或抵消,所以加密前的带入得出加密后的,加密后
的带入也就能得到加密前的

所以得出结果
mark

77486572655f30735f666c4167

代进程序里试试
mark

不过怎么看也不像是flag,况且给提示了,所以应该是被其他加密方式加密了吧

Flag

26位肯定不是MD5,长的像的只有16进制了,尝试后发现16进制转文本就是真正的flag
mark
就是下面这个了

wHere_0s_flAg

再带上格式
mark

轻松+200

文章作者: kabeor
文章链接: https://kabeor.github.io/2018.2%20MOCTFcrackme2%20WriteUp/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 K's House

评论